import "reflect-metadata";
import express, { Express } from "express";
import { Logger } from "./logger";

export class NestApplication {
  // 在内部私有化一个Express实例
  private readonly app: Express = express();
  constructor(protected readonly module) {}
  // 配置初始化工作
  async init() {
    // 取出模块里所有的控制器，然后做好路由配置
    const controllers = Reflect.getMetadata("controllers", this.module) || [];
    console.log(
      "获取到当前模块",
      this.module,
      "下的所有控制器  =>",
      controllers
    );
    Logger.log(
      "AppModule dependencies initialized => AppModule 模块初始化成功",
      "initialized"
    );
    // 遍历当前模块下的所有控制器（路由映射的核心是知道什么样的请求方法和什么样的路径对应哪个处理函数）
    for (const Controller of controllers) {
      // 创建每个控制器的实例
      const controller = new Controller();
      // 获取控制器的路径前缀
      const prefix = Reflect.getMetadata("prefix", Controller) || "/";
      console.log("获取到当前控制器", Controller, "的路径前缀  =>", prefix);
      // 开始解析路由
      Logger.log(
        `${Controller.name} {${prefix}} => 路由解析器: 开始解析路由`,
        "RoutesResolver"
      );
    }
  }
  // 启动HTTP服务
  async listen(port: number) {
    // 初始化
    await this.init();
    // 调用express实例的listen方法启动一个HTTP服务，监听prot端口 => 启动服务
    this.app.listen(port, () => {
      Logger.log(
        `Application is running on: http://localhost:${port}`,
        "NestApplication"
      );
    });
  }
}
